﻿#pragma once

#include <string>
#include <cassert>
#include <Windows.h>

/**
 * 定义在本程序中使用的异常类型
 *
 * 因为标准库里的异常基类都是基于char*，所以为了简单起见，这里独立定义了一个异常类
 */
class watch_dog_exception
{
public:
    /**
     * @brief 构建watch_dog_exception异常
     *
     * @param result API接口调用结果
     * @param msg API名称
     */
    watch_dog_exception(HRESULT result, const std::wstring& msg)
        : hr(result)
        , message(msg)
    {
    }

    const std::wstring& what() const noexcept
    {
        return message;
    }

    HRESULT error_code() const noexcept
    {
        return hr;
    }

private:
    HRESULT hr;             // 错误码
    std::wstring message;   // 异常信息，在此程序中只存储API接口的名称
};

/**
 * @brief 检查COM接口调用是否成功
 *
 * @param result 接口返回值
 * @param name 接口名称
 */
inline void check_result(HRESULT result, const WCHAR* name)
{
    assert(name != nullptr);
    if (FAILED(result))
    {
        throw watch_dog_exception(result, name);
    }
}
